package com.xrh.xdemo.service.utils;

import org.apache.commons.lang3.StringUtils;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xrh.xdemo.service.entity.SeqInfoEntity;
import com.xrh.xdemo.service.mapper.SeqInfoMapper;

import cn.hutool.extra.spring.SpringUtil;

public class SeqNoUtils {
	
	//药品医嘱组号的前缀
	public final static String MENU_SEQ = "MENU_SEQ";
	
	//通用递增序列
	public final static String COMMON_SEQ = "COMMON_SEQ";
	
	/**
	 * @function 创建菜单递增序列
	 * @author 肖荣辉
	 * @date 2023年8月22日
	*/
	public static long createMenuSeq() {
		
		SeqInfoMapper seqInfoMapper = SpringUtil.getBean("seqInfoMapper" , SeqInfoMapper.class);
		
		//各种and和or任意组合
		QueryWrapper<SeqInfoEntity> queryWrapper = new QueryWrapper<SeqInfoEntity>();
		queryWrapper.eq("prefix", MENU_SEQ);
		
		SeqInfoEntity seqInfoEntity = getSeqInfoEntity(MENU_SEQ , 0);
		
		seqInfoEntity.setSeqNo(seqInfoEntity.getSeqNo() + 1);
		
		seqInfoMapper.updateById(seqInfoEntity);
		
		return seqInfoEntity.getSeqNo();
		
	}
	
	/**
	 * @function 创建通用递增序列
	 * @author 肖荣辉
	 * @date 2023年6月6日
	*/
	public synchronized static int createCommonSeqInt() {
		
		return (int) createCommonSeq();
	}
	
	/**
	 * @function 创建通用递增序列
	 * @author 肖荣辉
	 * @date 2023年6月6日
	*/
	public synchronized static long createCommonSeq() {
		
		SeqInfoMapper seqInfoMapper = SpringUtil.getBean("seqInfoMapper" , SeqInfoMapper.class);
		
		//各种and和or任意组合
		QueryWrapper<SeqInfoEntity> queryWrapper = new QueryWrapper<SeqInfoEntity>();
		queryWrapper.eq("prefix", COMMON_SEQ);
		
		SeqInfoEntity seqInfoEntity = getSeqInfoEntity(COMMON_SEQ , 0);
		
		seqInfoEntity.setSeqNo(seqInfoEntity.getSeqNo() + 1);
		
		seqInfoMapper.updateById(seqInfoEntity);
		
		return seqInfoEntity.getSeqNo();
	}
	
	
	
	/**
	 * @function 根据前缀获取序列号
	 * @param prefix 前缀
	 * @param defaultSeq 默认从几开始
	 * @author 肖荣辉
	 * @date 2022年6月26日
	*/
	public synchronized static  long getSeqNo(String prefix ,  long defaultSeq) {
		
		if(StringUtils.isBlank(prefix))
			return -1;
		
		SeqInfoMapper seqInfoMapper = SpringUtil.getBean("seqInfoMapper" , SeqInfoMapper.class);
		
		//各种and和or任意组合
		QueryWrapper<SeqInfoEntity> queryWrapper = new QueryWrapper<SeqInfoEntity>();
		queryWrapper.eq("prefix", prefix);
		
		SeqInfoEntity seqInfoEntity = getSeqInfoEntity(prefix , defaultSeq);
		
		seqInfoMapper.updateById(seqInfoEntity);
		
		return seqInfoEntity.getSeqNo() + 1;
	}
	
	/**
	 * @function 新增一个新的prefix
	 * @param prefix 
	 * @author 肖荣辉
	 * @date 2022年5月11日
	*/
	private synchronized static  SeqInfoEntity getSeqInfoEntity(String prefix , long defaultSeq) {
		
		QueryWrapper<SeqInfoEntity> queryWrapper = new QueryWrapper<SeqInfoEntity>();
		queryWrapper.eq("prefix", prefix);
		
		SeqInfoMapper seqInfoMapper = SpringUtil.getBean("seqInfoMapper" , SeqInfoMapper.class);
		
		queryWrapper.last("limit 1");
		SeqInfoEntity seqInfoEntity = seqInfoMapper.selectOne(queryWrapper);
		
		if(seqInfoEntity != null)
			return seqInfoEntity;
		
		seqInfoEntity = new SeqInfoEntity(prefix, defaultSeq);
		
		seqInfoMapper.insert(seqInfoEntity);
		
		return seqInfoEntity;
	}
	
	/**
	 * @function 带前缀的序列编号
	 * @param prefix 前缀
	 * @author 肖荣辉
	 * @date 2022年6月26日
	*/
	public static  String createSeqNoWithPrefix(String prefix ,  long defaultSeq) {
		return prefix + getSeqNo(prefix , defaultSeq);
		
	}
	
	
	/**
	 * @function 根据前缀生成序列 , 保持指定位数,中间填充8
	 * @param  prefix  前缀
	 * @param keepDigits 保持序列位数
	 * @author 肖荣辉
	 * @date 2022年6月26日
	*/
	public static String getSeqNo(String prefix , int keepDigits , long defaultSeq) {
		String seqNo = getSeqNo(prefix , defaultSeq) + "";
		return prefix + StringUtils.leftPad(seqNo , keepDigits -  seqNo.length() , "0");
	}
	
}
